// 导入Redux Toolkit的核心功能
import { createSlice } from '@reduxjs/toolkit';

/**
 * 用户信息接口定义
 * 
 * 用于描述用户对象的结构
 */
interface UserInfo {
  id?: string; // 用户ID
  name?: string; // 用户姓名
  avatar?: string; // 用户头像URL
  phone?: string; // 用户手机号
  email?: string; // 用户邮箱
  isLoggedIn: boolean; // 是否已登录
}

/**
 * 用户状态接口定义
 * 
 * 用于描述用户相关状态的结构
 */
interface UserState {
  userInfo: UserInfo; // 用户信息
}

/**
 * 从localStorage获取初始用户信息
 * 
 * 功能：在应用启动时从本地存储恢复用户登录状态
 * 
 * 处理逻辑：
 * 1. 尝试从localStorage读取用户信息
 * 2. 解析JSON数据
 * 3. 设置登录状态为true
 * 4. 如果读取失败，返回未登录状态
 * 
 * @returns {UserInfo} 返回用户信息对象
 */
const getInitialUserInfo = (): UserInfo => {
  try {
    const savedUserInfo = localStorage.getItem('userInfo');
    if (savedUserInfo) {
      const parsed = JSON.parse(savedUserInfo);
      return {
        ...parsed,
        isLoggedIn: true
      };
    }
  } catch (error) {
    console.error('解析用户信息失败:', error);
  }
  
  return {
    isLoggedIn: false
  };
};

/**
 * 初始状态定义
 * 
 * 设置用户相关状态的初始值
 */
const initialState: UserState = {
  userInfo: getInitialUserInfo() // 从localStorage获取用户信息
};

/**
 * 用户Slice配置
 * 
 * 管理用户相关的状态和操作
 */
const userSlice = createSlice({
  name: 'user', // slice名称
  initialState, // 初始状态
  reducers: {
    /**
     * 用户登录
     * 
     * 功能：设置用户登录状态并保存到localStorage
     * 
     * @param {UserState} state - 当前状态
     * @param {Object} action - action对象
     * @param {UserInfo} action.payload - 用户登录信息
     */
    login: (state, action: { payload: UserInfo }) => {
      state.userInfo = {
        ...action.payload,
        isLoggedIn: true
      };
      // 只保存登录信息到localStorage
      localStorage.setItem('userInfo', JSON.stringify(state.userInfo));
    },
    
    /**
     * 用户登出
     * 
     * 功能：清除用户登录状态并从localStorage删除用户信息
     * 
     * @param {UserState} state - 当前状态
     */
    logout: (state) => {
      state.userInfo = {
        isLoggedIn: false
      };
      // 清除localStorage中的用户信息
      localStorage.removeItem('userInfo');
    },
    
    /**
     * 更新用户信息
     * 
     * 功能：更新用户信息并同步到localStorage
     * 
     * @param {UserState} state - 当前状态
     * @param {Object} action - action对象
     * @param {Partial<UserInfo>} action.payload - 要更新的用户信息（部分字段）
     */
    updateUserInfo: (state, action: { payload: Partial<UserInfo> }) => {
      state.userInfo = {
        ...state.userInfo,
        ...action.payload
      };
      // 更新localStorage中的用户信息
      if (state.userInfo.isLoggedIn) {
        localStorage.setItem('userInfo', JSON.stringify(state.userInfo));
      }
    }
  }
});

/**
 * 导出actions
 * 
 * 供组件使用的action creators
 */
export const { 
  login, // 用户登录
  logout, // 用户登出
  updateUserInfo // 更新用户信息
} = userSlice.actions;

/**
 * 导出reducer
 * 
 * 供store配置使用的reducer函数
 */
export default userSlice.reducer; 